package test;

import java.util.ArrayList;
import java.util.List;

public class FangPai {

    public static void main(String[] args) {
        int[] arr = {1,2,3,5,4,4,8,6,5,6,7,7,9,10,10,11,11};
        // 定义容器保存结果
        List<Integer> resList = new ArrayList<>();
        // 定义记录改变的数组
        int[] memory = new int[arr.length];
        // 状态指针
        int num = 0;
        int max = Integer.MAX_VALUE;

        // 开始递归
        diGuiMethod(max,num,arr,memory,resList);
        // 输出
        System.out.println(resList.get(resList.size() - 1));

    }

    public static void diGuiMethod(int max,int num, int[] arr, int[] memory, List<Integer> resList) {
        // 停止条件
        if (isEnd(memory)){
            // 保存解
            if (max > num){
                max = num;
            }
            resList.add(max);
            return;
        }
        // 获取状态列表
        List<int[]> nextState = getNextState(arr,memory);

        // 状态检查
        if (nextState.size() != 0){
            // 循环状态
            for (int[] aNextState : nextState) {
                // 改变状态
                int[] temp = arr;
                arr = aNextState;
                // 递归
                diGuiMethod(max, num, arr, memory, resList);
                // 返回原状态
                arr = temp;
            }
        }
    }

    private static List<int[]> getNextState(int[] arr, int[] memory) {
        List<int[]> nextState = new ArrayList<>();
        for (int i = 0;i < arr.length;i ++){
            for (int j = i; j < arr.length ; j++){
                if (isLegal(i,j,arr,memory)){
                    for (int k = i; k <= j;k++){
                        memory[k] = 1;
                    }
                }
            }
        }

        return null;
    }

    private static boolean isLegal(int i, int j, int[] arr, int[] memory) {
        return false;
    }

    private static boolean isEnd(int[] memory) {
        for (int i = 0;i < memory.length;i++){
            if (memory[i] == 0){
                return false;
            }
        }
        return true;
    }

}
